跳到主要内容

Linux 网络管理&请求

netstat 显示网络状态

Linux netstat 命令用于显示网络状态。

利用 netstat 指令可让你得知整个 Linux 系统的网络情况。

显示详细的网络状况

netstat -a

-t 或--tcp 显示TCP传输协议的连线状况。 -u 或--udp 显示UDP传输协议的连线状况。

查看某端口占用情况

查看某端口占用情况

lsof -i :端口号

以下命令可用于杀死占用某端口的所有进程。

kill -9 $(lsof -i tcp:进程号 -t)

查找端口对应的文件

nginx 服务器有很多项目,根据不同的端口号配置了多个项目的访问。现在需要查询端口号 8088 所占用的进程,并且查询进程启动的项目文件所在位置。

根据端口号查询进程ID

netstat -apn | grep 8088

根据进程ID查询启动的句柄(socket)

第一种方法(不推荐)

ps -aux | grep 1205

第二种方法(推荐)

lsof -p 1205

telnet 命令

telnet 命令通常用来远程登录。但是,telnet 因为采用明文传送报文,安全性不好,很多 Linux 服务器都不开放 telnet 服务,而改用更安全的 SSH 方式了。不过还是可以使用它来简单连接一些服务,或者测试连通性

测试端口联通性

telnet ip port

使用例:

nc 命令 ⭐

ncat 或者说 nc 是一款功能类似 cat 的工具,但是是用于网络的。它是一款拥有多种功能的 CLI 工具,可以用来在网络上读、写以及重定向数据。

ncat/nc 既是一个端口扫描工具,也是一款安全工具,还能是一款监测工具,甚至可以做为一个简单的 TCP 代理。

监听入站连接

通过 -l 选项,ncat 可以进入监听模式,使我们可以在指定端口监听入站连接。

# nc -l port_number
nc -l 8080

服务器就会开始在 8080 端口监听入站连接,但是注意这个监听是要占用这个端口的

连接远程系统

使用下面命令可以用 nc 来连接远程系统

nc IP_address port_number

如下:

nc 192.168.43.22 80

可以输入下面内容来获取完整的网页内容

GET / HTTP/1.1

连接 UDP 端口

默认情况下,nc 创建连接时只会连接 TCP 端口。 不过可以使用 -u 选项来连接到 UDP 端口

nc -l -u 1234

现在系统会开始监听 UDP 的 1234 端口,可以使用下面的 netstat 命令来验证这一点,

$ netstat -tunlp | grep 1234
udp 0 0 0.0.0.0:1234 0.0.0.0:* 17341/nc
udp6 0 0 :::1234 :::* 17341/nc

假设我们想发送或者说测试某个远程主机 UDP 端口的连通性,我们可以使用下面命令

nc -v -u {host-ip} {udp-port}

如下

[root@localhost ~]# nc -v -u 192.168.105.150 53
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 192.168.105.150:53。

简单的 TCP 连接

nc 也可以作为聊天工具来用,可以配置服务器监听某个端口,然后从远程主机上连接到服务器的这个端口,就可以开始发送消息了。 在服务器这端运行:

nc -l 8080

在远程客户端主机上运行:

nc 192.168.1.100 8080

之后开始发送消息,这些消息会在服务器终端上显示出来。

通过 nc 进行端口转发

通过选项 -c 来用 nc 进行端口转发,实现端口转发的语法为:

nc -u -l  80 -c  'nc -u -l 8080'

这样,所有连接到 80 端口的连接都会转发到 8080 端口。

通过 nc 远程连接

nc 命令还可以用来在系统中创建后门,并且这种技术也确实被黑客大量使用。 为了保护我们的系统,我们需要知道它是怎么做的。 创建后门的命令为:

nc -l 10000 -e /bin/bash

-e 标志将一个 bash 与端口 10000 相连。现在客户端只要连接到服务器上的 10000 端口就能通过 bash 获取我们系统的完整访问权限:

nc 192.168.1.100 10000

设置连接超时

nc 的监听模式会一直运行,直到手工终止。 不过可以通过选项 -w 设置超时时间:

nc -w 10 192.168.1.100 8080

这回导致连接 10 秒后终止,不过这个选项只能用于客户端而不是服务端。

使用 -k 选项强制 nc 待命

当客户端从服务端断开连接后,过一段时间服务端也会停止监听。 但通过选项 -k 我们可以强制服务器保持连接并继续监听端口。 命令如下:

nc -l -k 8080

现在即使来自客户端的连接断了也依然会处于待命状态。

wget 命令

wget 命令用于在终端中下载文件,格式为:

wget [参数] 下载地址

常用命令参数:

参数作用
-b–background 启动后转入后台执行
-P下载到指定目录
-t最大尝试次数
-c断点续传
-P下载页面的所有资源,包括图片视频
-r递归下载

启动参数

-V, –version 显示wget的版本后退出

-h, –help 打印语法帮助

-b, –background 启动后转入后台执行

-e, –execute=COMMAND 执行`.wgetrc’格式的命令,wgetrc格式参见/etc/wgetrc或~/.wgetrc

记录和输入文件参数

-o, –output-file=FILE 把记录写到FILE文件中

-a, –append-output=FILE 把记录追加到FILE文件中

-d, –debug 打印调试输出

-q, –quiet 安静模式(没有输出)

-v, –verbose 冗长模式(这是缺省设置)

-nv, –non-verbose 关掉冗长模式,但不是安静模式

-i, –input-file=FILE 下载在FILE文件中出现的URLs

-F, –force-html 把输入文件当作HTML格式文件对待

-B, –base=URL 将URL作为在-F -i参数指定的文件中出现的相对链接的前缀

–sslcertfile=FILE 可选客户端证书

–sslcertkey=KEYFILE 可选客户端证书的KEYFILE

–egd-file=FILE 指定EGD socket的文件名

下载参数

–bind-address=ADDRESS 指定本地使用地址(主机名或IP,当本地有多个IP或名字时使用)

-t, –tries=NUMBER 设定最大尝试链接次数(0 表示无限制).

-O –output-document=FILE 把文档写到FILE文件中

-nc, –no-clobber 不要覆盖存在的文件或使用.#前缀

-c, –continue 接着下载没下载完的文件

–progress=TYPE 设定进程条标记

-N, –timestamping 不要重新下载文件除非比本地文件新

-S, –server-response 打印服务器的回应

–spider 不下载任何东西

-T, –timeout=SECONDS 设定响应超时的秒数

-w, –wait=SECONDS 两次尝试之间间隔SECONDS秒

–waitretry=SECONDS 在重新链接之间等待1…SECONDS秒

–random-wait 在下载之间等待0…2*WAIT秒

-Y, –proxy=on/off 打开或关闭代理

-Q, –quota=NUMBER 设置下载的容量限制

–limit-rate=RATE 限定下载输率

目录参数

-nd –no-directories 不创建目录

-x, –force-directories 强制创建目录

-nH, –no-host-directories 不创建主机目录

-P, –directory-prefix=PREFIX 将文件保存到目录 PREFIX/…

–cut-dirs=NUMBER 忽略 NUMBER层远程目录

递归下载参数

-r, –recursive 递归下载--慎用!

-l, –level=NUMBER 最大递归深度 (inf 或 0 代表无穷)

–delete-after 在现在完毕后局部删除文件

-k, –convert-links 转换非相对链接为相对链接

-K, –backup-converted 在转换文件X之前,将之备份为 X.orig

-m, –mirror 等价于 -r -N -l inf -nr

-p, –page-requisites 下载显示HTML文件的所有图片

curl 工具

curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。

不带有任何参数时,curl 就是发出 GET 请求。

curl https://www.example.com

指定请求类型

-X 参数指定 HTTP 请求的方法。

$ curl -X POST https://www.example.com

设置请求头

-H 参数添加 HTTP 请求的标头。

$ curl -H 'Accept-Language: en-US' https://google.com

上面命令添加 HTTP 标头 Accept-Language: en-US

$ curl -H 'Accept-Language: en-US' -H 'Secret-Message: xyzzy' https://google.com

上面命令添加两个 HTTP 标头。

$ curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://google.com/login

上面命令添加 HTTP 请求的标头是 Content-Type: application/json ,然后用 -d 参数发送 JSON 数据。

设置请求的客户端

-A 参数指定客户端的用户代理标头,即 User-Agent。

curl 的默认用户代理字符串是 curl/[version]

curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://google.com

上面命令将 User-Agent 改成 Chrome 浏览器。

curl -A '' https://google.com

上面命令会移除 User-Agent 标头。

也可以通过 -H 参数直接指定标头,更改 User-Agent。

curl -H 'User-Agent: php/1.0' https://google.com

-b 参数用来向服务器发送 Cookie

curl -b 'foo=bar' https://google.com

上面命令会生成一个标头 Cookie: foo=bar,向服务器发送一个名为foo、值为bar的 Cookie。

curl -b 'foo1=bar;foo2=bar2' https://google.com

上面命令发送两个 Cookie。

curl -b cookies.txt https://www.google.com

上面命令读取本地文件 cookies.txt,里面是服务器设置的 Cookie(参见 -c 参数),将其发送到服务器。

-c 参数将服务器设置的 Cookie 写入一个文件。

curl -c cookies.txt https://www.google.com

上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件 cookies.txt

上传二进制文件

-F 参数用来向服务器上传二进制文件。

$ curl -F 'file=@photo.png' https://google.com/profile

上面命令指定 MIME 类型为 image/png,否则 curl 会把 MIME 类型设为 application/octet-stream

-F 参数也可以指定文件名。

$ curl -F 'file=@photo.png;filename=me.png' https://google.com/profile

上面命令中,原始文件名为 photo.png,但是服务器接收到的文件名为 me.png

添加请求体

-d 参数用于发送 POST 请求的数据体。

$ curl -d'login=emma&password=123'-X POST https://google.com/login
# 或者
$ curl -d 'login=emma' -d 'password=123' -X POST https://google.com/login

使用 -d 参数以后,HTTP 请求会自动加上标头 Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法,因此可以省略 -X POST

-d 参数可以读取本地文本文件的数据,向服务器发送。

$ curl -d '@data.txt' https://google.com/login

上面命令读取 data.txt 文件的内容,作为数据体向服务器发送。

--data-urlencode 参数等同于 -d,发送 POST 请求的数据体,区别在于会自动将发送的数据进行 URL 编码。

$ curl --data-urlencode 'comment=hello world' https://google.com/login

上面代码中,发送的数据 hello world 之间有一个空格,需要进行 URL 编码。

添加请求的来源

-e 参数用来设置 HTTP 的标头Referer,表示请求的来源。

curl -e 'https://google.com?q=example' https://www.example.com

上面命令将 Referer 标头设为 https://google.com?q=example

-H 参数可以通过直接添加标头 Referer,达到同样效果。

curl -H 'Referer: https://google.com?q=example' https://www.example.com

设置请求代理

-x 参数指定 HTTP 请求的代理。

$ curl -x socks5://james:cats@myproxy.com:8080 https://www.example.com

上面命令指定 HTTP 请求通过 myproxy.com:8080 的 socks5 代理发出。

如果没有指定代理协议,默认为 HTTP。

$ curl -x james:cats@myproxy.com:8080 https://www.example.com

上面命令中,请求的代理使用 HTTP 协议。

保存文件

-o 参数将服务器的回应保存成文件,等同于 wget 命令。

$ curl -o example.html https://www.example.com

上面命令将 www.example.com 保存成 example.html

-O 参数将服务器回应保存成文件,并将 URL 的最后部分当作文件名。

$ curl -O https://www.example.com/foo/bar.html

上面命令将服务器回应保存成文件,文件名为 bar.html

Reference